package class3;

import common.ListNode;
import common.ListNodeUtils;

/**
 * 反转单链表指针
 */
public class Code01_ReverseList {

    public static void main(String[] args) {
        Node n1 = new Node(1);
        n1.next = new Node(2);
        n1.next.next = new Node(3);
        n1 = reverseLinkedList(n1);
//        System.out.println(n1.d);
        while (n1 != null) {
            System.out.println(n1.d);
            n1 = n1.next;
        }
    }

    /**
     * 1  -> 2 ->  3 ->  4 ->  5 -> null
     * pre head -next
     * <p>
     * null <- 1 <-  2 <- 3 <- 4 <- 5
     * 步骤 1 (next = head.next;)：我们首先保存当前节点的下一个节点 head.next，这样我们就可以在修改 head.next 后，依然能够访问原先的下一个节点。此时 next 是指向当前节点的下一个节点。
     * 步骤 2 (head.next = pre;)：将当前节点的 next 指向前一个节点，实际上就实现了链表的反转。此时 head.next 已经指向了前一个节点。
     * 步骤 3 (pre = head;)：更新 pre 为当前节点。因为下一轮循环中，当前节点会变成上一轮的节点，所以 pre 应该指向当前节点。
     * 步骤 4 (head = next;)：将 head 更新为下一个节点，继续处理链表中的下一个元素。
     */
    private static Node reverseLinkedList(Node head) {
        Node next = null;
        Node pre = null;
        while (head != null) {
            next = head.next; // 保存当前节点的下一个节点
            head.next = pre; // 将当前节点的 next 指向前一个节点
            pre = head;        // 将 pre 移动到当前节点
            head = next;          // 将 head 移动到下一个节点
        }
        return pre;
    }


    static class Node {
        int d;
        Node next;

        public Node(int d) {
            this.d = d;
        }
    }

}

